//
//  List.m
//  AlgorithmDemo
//
//  Created by zxs on 2020/8/5.
//  Copyright © 2020 zxs. All rights reserved.
//

#import "List.h"

@interface List()

// 头结点
@property (strong, nonatomic) ListNode *head;

@end

@implementation List

// 添加节点，加在头部
- (void)addNode:(ListNode *)node {
    // 空节点不需要添加
    if (node == nil) {
        return;
    }
    
    // key可以重复，可以相同，没必要检查是否存在
    
    // 添加到头部
    if (self.head != nil) {
        node.next = self.head;
        self.head = node;
    } else {
        self.head = node;
    }
}

// 方便方法，添加一组节点
- (void)addNodes:(NSArray *)datas {
    [datas enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        [self addNode:[ListNode nodeWithData:obj]];
    }];
}

// 读取所有节点
- (NSArray *)readAllNodes {
    NSMutableArray *nodes = [NSMutableArray array];
    ListNode *temp = self.head;
    while (temp) {
        [nodes addObject:temp];
        NSLog(@"node key:%ld; node data: %@", (long)temp.key, temp.data);
        temp = temp.next;
    }
    
    return [nodes copy];
}

// 倒序
- (void)reverse {
    ListNode *previous = nil;
    ListNode *current = self.head;
    ListNode *next = nil;
    
    while (current) {
        // 1. 将下一个保存在`next`中。
        next = current.next;
        // 2. 反转：将下一个指向前一个。
        current.next = previous;
        // 3. 移动：前一个移动到当前。
        previous = current;
        // 4. 移动：当前移动到下一个。
        current = next;
    }
    
    // current已经移动到最后，previous就是新的头
    self.head = previous;
}


@end
